package com.boot2.core.dao.jpa;

import com.boot2.core.dao.AbstractRestrictions;
import com.boot2.core.dao.jpa.Criterion.Operator;
import org.hibernate.criterion.MatchMode;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 
 * @ClassName: JpaRestrictions
 * @description: JPA条件构造器 用于创建条件表达式
 * @author zhangweilin
 * @date 2017年12月27日 上午11:14:03
 *
 */
public class JpaRestrictions extends AbstractRestrictions {

	/**
	 * 等于,对应的操作符 =
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression eq(String fieldName, Object value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Criterion.Operator.EQ);
	}

	/**
	 * 不等于,对应的操作符 !=
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression ne(String fieldName, Object value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Criterion.Operator.NE);
	}

	/**
	 * 模糊匹配,对应的操作符 like
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression like(String fieldName, String value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Criterion.Operator.LIKE);
	}

	/**
	 * 
	 * @param fieldName
	 * @param value
	 * @param matchMode
	 * @param ignoreNull
	 * @return
	 */
	@Deprecated
	public static SimpleExpression like(String fieldName, String value, MatchMode matchMode, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return null;
	}

	/**
	 * 大于 ,对应的操作符 >
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression gt(String fieldName, Object value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Criterion.Operator.GT);
	}

	/**
	 * 小于,对应的操作符 <
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression lt(String fieldName, Object value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Criterion.Operator.LT);
	}

	/**
	 * 大于等于,对应的操作符 >=
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression lte(String fieldName, Object value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Criterion.Operator.LTE);
	}

	/**
	 * 小于等于,对应的操作符 <=
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression gte(String fieldName, Object value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Criterion.Operator.GTE);
	}

	/**
	 * in
	 *
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression in(String fieldName, Object value, boolean ignoreNull) {
		if (StringUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.IN);
	}

	/**
	 * 区间查询,请注意，凡是有区间查询的操作，在po或vo中命名时，左边界约定一律为原属性名+1,右边界为+2,比如查询年龄范围，有原属性为age,则左边界为age1,右边界为age2
	 * 
	 * @param fieldName
	 * @param valueArr
	 *            左边界
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression between(String fieldName, Object[] valueArr, boolean ignoreNull) {
		if (null == valueArr||valueArr.length < 2) {
			return null;
		}
		if (valueArr[0] == null || valueArr[1] == null) {
			return null;
		}
		return new SimpleExpression(fieldName, valueArr, Criterion.Operator.BETWEEN);
	}

	/**
	 * 并且
	 * 
	 * @param criterionArr
	 * @return
	 */
	public static LogicalExpression and(Criterion... criterionArr) {
		return new LogicalExpression(criterionArr, Criterion.Operator.AND);
	}

	/**
	 * 并且
	 * 
	 * @param criterionList
	 * @return
	 */
	public static LogicalExpression and(List<Criterion> criterionList) {
		return new LogicalExpression(criterionList.toArray(new Criterion[] {}), Criterion.Operator.AND);
	}

	/**
	 * 或者
	 * 
	 * @param criterionArr
	 * @return
	 */
	public static LogicalExpression or(Criterion... criterionArr) {
		return new LogicalExpression(criterionArr, Criterion.Operator.OR);
	}

	/**
	 * 或者
	 * 
	 * @param criterionList
	 * @return
	 */
	public static LogicalExpression or(List<Criterion> criterionList) {
		return new LogicalExpression(criterionList.toArray(new Criterion[] {}), Criterion.Operator.OR);
	}

//	/**
//	 * 包含于
//	 *
//	 * @param fieldName
//	 * @param value
//	 * @return
//	 */
//	@SuppressWarnings("rawtypes")
//	public static LogicalExpression in(String fieldName, Collection value, boolean ignoreNull) {
//		if (ignoreNull && (value == null || value.isEmpty())) {
//			return null;
//		}
//		SimpleExpression[] ses = new SimpleExpression[value.size()];
//		int i = 0;
//		for (Object obj : value) {
//			ses[i] = new SimpleExpression(fieldName, obj, Criterion.Operator.EQ);
//			i++;
//		}
//		return new LogicalExpression(ses, Criterion.Operator.OR);
//	}
}